package com.itcast.demoone.kotlin

fun main() {
    // letDemo()
    // withDemo()
    runDemo()
}

fun letDemo() {
    val name: String? = "ZhangSanFen"

    val res = name?.let {
        println("Name length: ${it.length}") // 仅当 name 非空时执行
        it.uppercase() // 返回值
    } // 返回 null（因为 name 为 null）

    println(res)

    // 等效的非空检查：
    /* if (name != null) {
         println(name.length)
     }*/
}

fun withDemo() {
    // 定义一个简单的汽车类
    class Car {
        var isEngineRunning = false
        var isACOn = false
        var currentMusic = ""
        var navigationDestination = ""
        var speed = 0

        fun startEngine() {
            isEngineRunning = true
            println("引擎已启动")
        }

        fun turnOnAC() {
            isACOn = true
            println("空调已开启")
        }

        fun playMusic(genre: String) {
            currentMusic = genre
            println("正在播放 $genre 音乐")
        }

        fun setNavigation(destination: String) {
            navigationDestination = destination
            println("导航目的地设置为: $destination")
        }

        fun accelerate() {
            speed += 10
            println("加速至 $speed km/h")
        }

        fun displayStatus() {
            println("\n=== 当前汽车状态 ===")
            println("引擎状态: ${if (isEngineRunning) "运行中" else "关闭"}")
            println("空调状态: ${if (isACOn) "开启" else "关闭"}")
            println("播放音乐: ${currentMusic.ifEmpty { "无" }}")
            println("导航目的地: ${navigationDestination.ifEmpty { "未设置" }}")
            println("当前速度: $speed km/h")
        }
    }

    // --------------------------------------------------------

    // 创建汽车对象
    val myCar = Car()

    println("准备开车回家...")

    // 使用 with 操作汽车对象
    with(myCar) {
        startEngine()       // 直接调用方法
        turnOnAC()          // 不需要 myCar.turnOnAC()
        playMusic("Jazz")   // 直接访问方法
        setNavigation("家") // 设置目的地

        // 连续加速
        repeat(3) {
            accelerate()
        }
    }

    // 显示最终状态
    myCar.displayStatus()

    println("\n旅程结束，安全到家！")
}

fun runDemo() {
    // 1. 简化多步计算
    val area = run {
        val width = 10
        val height = 5
        width * height // 返回面积
    }
    println("矩形面积: $area") // 输出: 矩形面积: 50

    // 2. 临时变量隔离
    val result = run {
        // 这里的临时变量不会影响外部
        val a = 5
        val b = 3
        a * b
    }
    // 外部访问不到 a 和 b
    println("结果: $result") // 输出: 结果: 15

    // 3. 安全转换
    val userInput = "张三丰"
    val number = run {
        // 尝试转换为数字
        val parsed = userInput.toIntOrNull()
        parsed ?: 0 // 如果转换失败返回0
    }
    println("数字: $number") // 输出: 数字: 123

    // 4. 对象初始化
    val person = run {
        val name = "小明"
        val age = 12
        val grade = 5

        // 创建描述字符串
        "$name ($age 岁), $grade 年级"
    }
    println(person) // 输出: 小明 (12岁), 5年级
}

